/// <summary>
/// 后端服务的主程序入口点
/// </summary>

// 引入必要的命名空间
using Microsoft.AspNetCore.Authentication.JwtBearer;  // JWT Bearer 认证
using Microsoft.AspNetCore.Identity;                  // 身份验证
using Microsoft.IdentityModel.Tokens;                 // Token 相关功能
using System.Text;                                    // 文本编码
using 后端服务.Models;                               // 数据模型
using 后端服务.Services;                             // 服务层

// 创建 Web 应用程序构建器实例
var builder = WebApplication.CreateBuilder(args);

// 配置日志
builder.Logging.ClearProviders();
builder.Logging.AddConsole();
builder.Logging.AddDebug();
builder.Logging.AddFile("Logs/ef-{Date}.log"); // 添加文件日志

#region 配置服务容器

// 添加 MVC 相关服务
builder.Services.AddRazorPages();           // 添加 Razor Pages 支持，用于服务器端渲染
builder.Services.AddControllers();          // 添加 API 控制器支持
builder.Services.AddEndpointsApiExplorer(); // 添加 API 接口资源探索服务
builder.Services.AddSwaggerGen();           // 添加 Swagger 文档生成服务

// 配置 JWT（JSON Web Token）身份验证
var jwtKey = builder.Configuration["Jwt:Key"] ?? throw new ArgumentNullException("JWT Key is not configured");
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,                                              // 验证签名密钥
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtKey)), // 设置签名密钥
            ValidateIssuer = false,                                                       // 不验证颁发者
            ValidateAudience = false,                                                     // 不验证接收者
            ClockSkew = TimeSpan.Zero                                                     // 设置时钟偏移为零
        };
    });

// 注册应用服务
builder.Services.AddScoped<IPasswordHasher<User>, PasswordHasher<User>>(); // 密码哈希服务
builder.Services.AddScoped<AuthService>();                                 // 身份验证服务
builder.Services.AddScoped<JwtService>();                                  // JWT 服务
builder.Services.AddScoped<VersionService>();                              // 版本服务
builder.Services.AddScoped<SqlQueryService>();                             // SQL 查询服务
builder.Services.AddSingleton<SqlLoggerService>();                         // SQL 日志服务
builder.Services.AddScoped<IVideoService, VideoService>();                 // 视频服务

// 配置跨域资源共享 (CORS)
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowAll", builder =>
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader());
});

#endregion

// 构建应用程序
var app = builder.Build();

#region 配置 HTTP 请求处理管道

// 在开发环境中启用 Swagger
//if (app.Environment.IsDevelopment())
//{
//    app.UseSwagger();
//    app.UseSwaggerUI();
//}
app.UseSwagger();
app.UseSwaggerUI();

app.UseHttpsRedirection(); // 启用 HTTPS 重定向
app.UseStaticFiles();      // 启用静态文件服务
app.UseCors("AllowAll");   // 启用 CORS 中间件
app.UseRouting();          // 启用路由中间件
app.UseAuthentication();    // 启用身份验证中间件
app.UseAuthorization();     // 启用授权中间件

// 配置根路径重定向到 Swagger 文档页面
app.MapGet("/", () => Results.Redirect("/swagger"));

app.MapControllers();      // 映射 API 控制器路由
app.MapRazorPages();       // 映射 Razor Pages 路由

#endregion

// 启动应用程序
app.Run();
